# pragma once

# include "cpp_tools.h"

class chassis_controller
{
public:
    struct controlOutPut
    {
        double steering = 0; // 车轮转角 [-1,1] 无单位
        double drive = 0; // 驱动力/制动力输出 [-1,1] 无单位
    };  

public: 
    chassis_controller()
    {
        
    };

    ~chassis_controller()
    {
        
    };

    /// @brief 调用该函数用于提前停止对象工作
    virtual void shutdown()
    {

    };

    /// @brief 设置模式, 目前通过D_pad_lr设置
    /// @param D_pad_lr 
    virtual void setMode(int D_pad_lr)
    {

    };

    /// @brief 设置输出值
    /// @param steering 转向 [-1, 1]
    /// @param drive 驱动 [-1, 1]
    virtual void setOutPut(double steering, double drive) = 0;

    /// @brief 获取实际的输出值
    /// @return steering,drive
    virtual controlOutPut getOutPut() = 0;

    /// @brief 根据标定将期望的纵向力映射为油门量
    /// @param v 当前速度 m/s
    /// @param F_x_des 期望纵向力 N
    /// @return 油门控制量[-1,1]
    virtual double forceMapping(double v, double F_x_des) const = 0;
    
    /// @brief 从期望前轮转角映射到RC控制的转向量
    /// @param delta_f_des 期望前轮转角, 单位 rad
    /// @return 返回范围为[-1,1]的转向行程 
    virtual double steeringMapping(double delta_f_des) const = 0;

    chassis_controller(const chassis_controller&) = delete;
};

